package com.demo.quartz;

import com.google.common.collect.Lists;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.List;

/**
 * @author jasper
 */
public class TestJob {
    public static void main(String[] args) throws SchedulerException {

        List<Integer> numList = Lists.newArrayList(5,15,25,35,45,55,5,15,25,30);

        /**
         * SchedulerFactory的一个实现，它执行所有的工作，基于一个Properties文件的内容创建一个QuartzScheduler实例。
         * 默认情况下，从“当前工作目录”加载名为“quartz.properties”的属性文件。
         * 如果失败，那么将加载位于org / quartz包中的（作为资源）的“quartz.properties”文件。
         * 如果您希望使用除这些默认值之外的文件，则必须定义系统属性“org.quartz.properties”以指向所需的文件。
         */
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = null;
        for (int num : numList) {
            JobDetail jobDetail1 = JobBuilder.newJob(TestJobExecutionTime.class)
                    .withIdentity("job1"+num, "group1")
                    .build();

            JobDetail jobDetail2 = JobBuilder.newJob(MyJob2.class)
                    .withIdentity("job2"+num, "group2")
                    .build();
            jobDetail2.getJobDataMap().put("data",num);

            Trigger trigger = TriggerBuilder.newTrigger()
                    // 参数1触发器名 参数2触发器组,如果不创建将自动生成
                    .withIdentity("simple trigger", "group1")
                    // 设置一个实现了ScheduleBuilder接口的触发器
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            // 指定触发间隔,以秒为单位
                            .withIntervalInSeconds(5)
                            // 设置执行次数
                            .withRepeatCount(5))
                    .build();
            CronTrigger trigger1 = TriggerBuilder.newTrigger()
                    .withIdentity("cron trigger1"+num, "group1")
                    .withSchedule(
                            // 每5秒执行一次 0/5 * * ? * *
                            // 每分钟的第五秒
                            CronScheduleBuilder.cronSchedule("3 0/1 * * * ?")).build();

            Trigger trigger2 = TriggerBuilder.newTrigger()
                    .withIdentity("cron trigger2"+num, "group2")
                    .withSchedule(
                            // 每5秒执行一次 0/5 * * ? * *
                            // 每分钟的第五秒
                            CronScheduleBuilder.cronSchedule(num+" * 0-23 * * ?")).build();
            /**
             * Scheduler是一个调度器
             * 一个Scheduler注册JobDetail和Trigger。一旦注册后，Scheduler 负责执行Job,前提是Trigger的预定时间到达。
             */
            scheduler = schedulerFactory.getScheduler();

            Trigger.TriggerState triggerState = scheduler.getTriggerState(TriggerKey.triggerKey("cron trigger" + num, "group1"));

            System.out.println("status2 "+triggerState+" "+num);
            if (triggerState != Trigger.TriggerState.NONE)
            {
                scheduler.interrupt(JobKey.jobKey("job2"+num,"group2"));
                scheduler.unscheduleJob(TriggerKey.triggerKey("cron trigger2"+num, "group2"));
            }

            Trigger.TriggerState triggerState1 = scheduler.getTriggerState(TriggerKey.triggerKey("cron trigger" + num, "group1"));

            System.out.println("status1 "+triggerState+" "+num);
            if (triggerState1 != Trigger.TriggerState.NONE)
            {
                scheduler.interrupt(JobKey.jobKey("job1"+num,"group1"));
                scheduler.unscheduleJob(TriggerKey.triggerKey("cron trigger1"+num, "group1"));
            }
            // 每分钟第5秒调度一次
            scheduler.scheduleJob(jobDetail2, trigger2);
            scheduler.scheduleJob(jobDetail1, trigger1);
        }
        try {
            scheduler.start();

        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}
